#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QTimer>
#include <QTcpServer>
#include <QTcpSocket>
#include "mate.h"
#include <QJsonObject>
#include <QJsonArray>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMouseEvent>
#include <QWidget>
#include <windows.h>
#include <windowsx.h>
#include <QLabel>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    bool eventFilter(QObject *watched, QEvent *event);   //事件过滤

private slots:
    void ReadData();//读取接收到的串口信息
    void timer();//刷新时间定时器计时器槽函数(1秒)
    void Patienttimer();//发送病人信息定时器计时器槽函数(0.1秒)
    void Dynamictimer();//动态刷新标签提示语定时器
    void newClientLink();//如果有新的客户端连接成功,该槽函数会被自动调用
    void recvclientmsg();//专门用来接收某个客户端信息的槽函数
    void unlink();//客户端断开了

    //http槽函数
    void requestFinished(QNetworkReply *reply);//刷新的槽
    void recvhttp(QNetworkReply *);
    void recvhttp2(QNetworkReply *);

    void on_pushButton_clicked();//匹对界面
    void on_pushButton_2_clicked();//重启按钮
    void on_pushButton_3_clicked();//展开按钮
    void on_pushButton_4_clicked();//置顶按钮
    void on_pushButton_5_clicked();//最小化按钮
    void on_pushButton_6_clicked();//最大化按钮
    void on_pushButton_7_clicked();//关闭按钮
    void on_pushButton_8_clicked();//文本框内容导入txt按钮
    void on_pushButton_9_clicked();//清空文本框按钮

private slots:
    void receRequesfMainData(QString,QString);//连接自定义HTTP槽函数   

protected:
    //重写事件实现窗口移动
    bool nativeEvent(const QByteArray &eventType, void *message, long *result);
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);

    //重写关闭事件
    void closeEvent(QCloseEvent *event);

private:
    void initialize();//初始化界面
    QString ParseData(QString Data,QString Key);//解析传过来的病人手术信息
    void getOversend(QString Data);//设置核对接收到的药品信息
    void setHttp();//设置http
    void getInfo();//获取更新服务器信息
    void topMostSlot(QWidget *parent);//置顶窗口
    void addBrowser(QString Data);//追加数据到文本框框中
    void automaticConnectionPort();//自动连接端口

private:
    Ui::MainWindow *ui;
//    QByteArray token2;
    QByteArray token;

//    QLabel *tooltip;//鼠标悬停提示框
    QPoint clickPos;
    Mate *mt;//匹对界面指针
    QStringList serialPortName;//保存所有连接串口
    QStringList serialPortName2;//保存上次所有连接串口
    QSerialPort *serial;//创建串口对象
    QTimer *mytimer;//刷新时间定时器
    QTimer *patienttimer;//发送病人信息定时器
    QTimer *dynamictimer;//动态刷新标签提示语定时器
//    QString markedWords;//标签提示语
    int markedNumber = 0;//标签提示语次数
    int COMNumber;//连接第几个串口
    int ifLink;//判断串口是否连接正确
    int sendSize;//剩余发送病人信息大小
    int sendSign;//发送病人信息字节位置
    int ifoversend;//记录over指令接收数据次数

    QByteArray sendBuf;//存储病人手术信息
    QJsonArray settingTable;//存放药品设置表
    QJsonArray NFCtable;//存放NFC设置表

    QTcpSocket *sock;
    QTcpServer *myserver;
    QVector<QTcpSocket *> myvector;  //向量容器存放套接字指针

    QTcpSocket  *sockp;//存放信号发送者tcp套接字

    QJsonObject patientInfo;//病人手术信息
    QString pharmacyInfo;//存储用药信息
    QString oversendBuf;//储存药箱发过来的用药信息

    QNetworkAccessManager manager;
    QNetworkAccessManager manager2;

    int sign;//窗口展开判断(0->展开,1->隐藏)

    Qt::WindowFlags m_flags;//设置置顶窗口

    bool ifWinMax = true;//判断窗口是否最大化
    bool ifPort = true;//判断和上次串口信息是否发生改变
};
#endif // MAINWINDOW_H
